package cn.com.dhcc.ddi.task.service.transform;

import org.apache.commons.lang.StringUtils;

import cn.com.dhcc.app.core.util.StrUtil;

import java.text.ParseException;
import java.text.SimpleDateFormat;
import java.util.Date;

import javax.script.ScriptEngine;
import javax.script.ScriptEngineManager;
import javax.script.ScriptException;

/**
 * 函数
 *
 * @日期：2016/11/24 11:10
 * @作者：张洪涛
 * @版权所有：东华软件
 * @版本：1.0
 */
public class FunctionAction {

    //文件名前后缀添加方式   0自定义
    private final String ADD_COMMON = "0";

    //排除表函数名
    public final static String REMOVE_TABLE = "removeTable";

    //排除字段函数名
    public final static String REMOVE_COL = "removeCol";

    //新增字段函数名
    public final static String ADD_COL = "addVrCol";

    //字符串运算
    public final static String STR_OPERATOR = "strOperator";

    //设置默认值
    public final static String SET_DEFAULT = "setDefault";

    //设置默认值，数据库系统时间
    public final static String SET_CURRENTDATE = "setCurrentDate";

    //当为空时设置默认值
    public final static String WHEN_NULL_SET_DEFAULT = "whenNullSetDefault";

    //将数值类型数据转换为整数(四舍五入)
    public final static String AROUND_TO_NUMBER = "aroundTonumber";

    //将数值类型数据转换为整数(无四舍五入)
    public final static String TRUNC_TO_NUMBER = "truncTonumber";

    //将长整型数字转换为日期格式的字符串
    public final static String STRING_TO_DATE = "stringToDate";

    //将日期格式的字符串转换为长整型
    public final static String CONVERT_TO_LONG = "convert2long";

    // 短日期格式
    public static String DATE_FORMAT = "yyyy-MM-dd";

    // 长日期格式
    public static String TIME_FORMAT = "yyyy-MM-dd HH:mm:ss";

    //是否为系统时间标志
    public static String datebase_system = "SYSDATE";

    //添加前缀
    public static String ADD_PREFIX_TO_TABLE_NAME = "addPrefixToTableName";

    //添加后缀
    public static String ADD_SUFFIX_TO_TABLE_NAME = "addSuffixToTableName";

    //文件名添加前缀
    public static String ADD_PREFIX_TO_FILE_NAME = "addPrefixToFileName";

    //文件名添加后缀
    public static String ADD_SUFFIX_TO_FILE_NAME = "addSuffixToFileName";


    /*****************************************************表操作*****************************************************************/

    /**
     * 排除表
     *
     * @return
     */
    public boolean removeTable(String table, String args) {
        String[] tables = args.split(",");
        for (String arg : tables) {
            if (table.equals(arg)) {
                return true;
            }
        }
        return false;
    }


    /**
     * 表名全文替换
     *
     * @param str
     * @param arg1
     * @return
     */
    public String changeTableName(String str, String arg1) {
        return arg1;
    }

    /**
     * 表名部分替换
     * 源字符串:userName  使用changeTo('user_name')之后结果为：user_name
     *
     * @param srcStr
     * @return
     * @pa newStr
     */
    public String changeTo(String str, String oldStr, String newStr) {
        return str.replaceAll(oldStr, newStr);
    }

    /**
     * 替换前缀
     *
     * @param str
     * @param oldStr
     * @param newStr
     * @return
     */
    public String replacePrefix(String str, String oldStr, String newStr) {
        if (str.toLowerCase().indexOf(oldStr.toLowerCase()) == 0) {
            str = str.substring(oldStr.length());
            return newStr + str;
        }
        return str.toLowerCase();
    }

    /**
     * 替换后缀
     *
     * @param str
     * @param oldStr
     * @param newStr
     * @return
     */
    public String replaceSuffix(String str, String oldStr, String newStr) {
        if (str.toLowerCase().lastIndexOf(oldStr.toLowerCase()) == str.length() - oldStr.length()) {
            str = str.substring(0, str.toLowerCase().lastIndexOf(oldStr.toLowerCase()));
            return str + newStr;
        }
        return str.toLowerCase();
    }


    /**
     * 在字符串前添加字符串，arg1：源字符串。arg2 前缀字符串
     * 源字符串:userName  使用preAppend('userName','c_')之后结果为：c_userName
     *
     * @param str
     * @param arg2
     * @return
     */
    public String addPrefixToTableName(String str, String arg2) {
        return arg2 + str;
    }


    /**
     * 在字符串后添加字符串，arg1：源字符串。arg2 前缀字符串
     * 源字符串:userName  使用preAppend('userName','_c')之后结果为：userName_c
     *
     * @param str
     * @param arg2
     * @return
     */
    public String addSuffixToTableName(String str, String arg2) {
        return str + arg2;
    }
/*****************************************************字段操作*****************************************************************/
    /**
     * 排除字段
     *
     * @return
     */
    public boolean removeCol(String col, String args) {
        String[] cols = args.split(",");
        for (String arg : cols) {
            if (col.equals(arg)) {
                return true;
            }
        }
        return false;
    }

    /**
     * 字段名替换
     *
     * @param str
     * @param arg1
     * @return
     */
    public String changeColName(String str, String arg1) {
        return arg1;
    }

    /**
     * 在字符串前添加字符串，arg1：源字符串。arg2 前缀字符串
     * 源字符串:userName  使用preAppend('userName','c_')之后结果为：c_userName
     *
     * @param str
     * @param arg2
     * @return
     */
    public String addPrefixToColName(String str, String arg2) {
        return arg2 + str;
    }


    /**
     * 在字符串后添加字符串，arg1：源字符串。arg2 前缀字符串
     * 源字符串:userName  使用preAppend('userName','_c')之后结果为：userName_c
     *
     * @param str
     * @param arg2
     * @return
     */
    public String addSuffixToColName(String str, String arg2) {
        return str + arg2;
    }

/*****************************************************字段值操作*****************************************************************/
    /**
     * 设置默认值。可自定义，也可选择常用默认值。
     *
     * @param defVal
     * @return
     */
    public String setDefault(String defVal) {
        return defVal;
    }

    /**
     * 设置默认值，数据库系统时间
     *
     * @return
     */
    public String setCurrentDate() {
        return "SYSDATE";
    }

    /**
     * 转换为整形数值,无四舍五入
     * 源值:11.61  使用truncTonumber之后结果为：11
     *
     * @param num
     * @return
     */
    public String truncTonumber(double num) {
        return Math.round(Math.floor(num)) + "";
    }

    /**
     * 转换为整形数值,四舍五入
     * 源值:11.61  使用aroundTonumber之后结果为：12
     *
     * @param num
     * @return
     */
    public String aroundTonumber(double num) {
        return Math.round(num) + "";
    }

    /**
     * 将长整型数字转换为日期格式的字符串
     *
     * @param num
     * @param format
     * @return
     */
    public String stringToDate(long num, String format) {
        if (num > 0l) {
            if (StringUtils.isBlank(format))
                format = TIME_FORMAT;
            SimpleDateFormat sf = new SimpleDateFormat(format);
            Date date = new Date(num);
            return sf.format(date);
        }
        return "";
    }

    /**
     * 将日期格式的字符串转换为长整型
     *
     * @param date
     * @param format
     * @return
     */
    public String convert2long(String date, String format) {
        if (StringUtils.isNotBlank(date)) {
            try {
                if (StringUtils.isBlank(format))
                    format = TIME_FORMAT;
                SimpleDateFormat sf = new SimpleDateFormat(format);
                return sf.parse(date).getTime() + "";
            } catch (ParseException e) {
                e.printStackTrace();
            }
        }
        return "0";
    }

    /**
     * 当为空时设置默认值。可自定义，也可选择常用默认值。可选值同setDefault。
     *
     * @param value
     * @param defVal
     * @return
     */
    public String whenNullSetDefault(String value, String defVal) {
        if (StringUtils.isBlank(value))
            value = setDefault(defVal);
        return value;
    }

    /**
     * 字段值相加
     *
     * @param value 字段值
     * @param val   加数
     * @return
     */
    public String calculate(double value, double val) {
        return (value + val) + "";
    }

    /**
     * @param @param  str
     * @param @param  expression
     * @param @param  val
     * @param @return
     * @param @throws ScriptException 参数
     * @return Object 返回类型
     * @throws
     * @Title: StrOperator
     * @Description: 字段值计算  字符串转换为表达式进行计算
     */
    public static Object strOperator(String str, String expression, String val) throws ScriptException {
        Object result = new Object();
        ScriptEngineManager manager = new ScriptEngineManager();
        ScriptEngine engine = manager.getEngineByName("js");
        if (expression.contains(str) && StrUtil.isNotBank(str)) {
            expression = expression.replace(str, val);
            result = engine.eval(expression);
        }

        return result;
    }

/*****************************************************文件名操作*****************************************************************/

    /**
     * 在字符串前添加字符串，str：源字符串。arg2 前缀字符串
     * 源字符串:userName  使用preAppend('userName','c_')之后结果为：c_userName
     *
     * @param fileAddMethod 文件名添加前缀方式 0自定义  1添加默认值即系统默认时间
     * @param str
     * @param arg2
     * @return
     */
    public String addPrefixToFileName(String str, String arg2, String fileAddMethod, String format) {
        if (ADD_COMMON.equals(fileAddMethod)) {
            return arg2 + str;
        } else {
            return setCurrentDate(format) + str;
        }
    }

    /**
     * 在字符串后添加字符串，str：源字符串。arg2 后缀字符串
     * 源字符串:userName  使用preAppend('userName','_c')之后结果为：userName_c
     *
     * @param fileAddMethod 文件名添加后缀方式 0自定义  1添加默认值即系统默认时间
     * @param str
     * @param arg2
     * @return
     */
    public String addSuffixToFileName(String str, String arg2, String fileAddMethod, String format) {
        if (ADD_COMMON.equals(fileAddMethod)) {
            return str + arg2;
        } else {
            return str + setCurrentDate(format);
        }
    }

    /**
     * 设置系统当前时间
     *
     * @param format
     * @return 时间字符串
     */
    public String setCurrentDate(String format) {
        String val = "";
        if (StrUtil.isNotBank(format)) {
            SimpleDateFormat dateFormat = new SimpleDateFormat(format);
            Date date = new Date();
            val = dateFormat.format(date);
        }
        return val;
    }
}
